package controlador;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.StringTokenizer;
import java.util.List;

import javax.swing.JFileChooser;
import javax.swing.filechooser.FileNameExtensionFilter;

import modelo.Organizacion;
import modelo.Producto;
import modelo.ProductoDAO;
import modelo.Tienda;
import modelo.TiendaDAO;

import vista.VentanaCargarProductos;
import vista.VentanaCargarProductosModeloTabla;



public class ControladorVentanaCargarProducto implements ActionListener {

	private VentanaCargarProductos ventanaCargarProductos;
	private JFileChooser fcVentanaAbrir;
	private FileNameExtensionFilter filtro;
	private File file;
	private Tienda tienda;
	private Organizacion organizacion;
	private Producto producto;
	private boolean registrarProducto;
	
	private ArrayList<Producto> otroProducto;
	private ArrayList<Producto> modelProducto = new ArrayList();
	private ArrayList<Producto> productoTienda;
	private ArrayList<Tienda> tiendas;

	private List<String> rift;
	
	private ProductoDAO productoDao;
	private TiendaDAO tiendaDao;
	
	private int numeroProducto;
	
	public ControladorVentanaCargarProducto(Organizacion organizacion) {
		// TODO Auto-generated constructor stub
		super();
		// TODO Auto-generated constructor stub
		
		ventanaCargarProductos = VentanaCargarProductos.getInstancia();
		ventanaCargarProductos.setLocationRelativeTo(null);
		ventanaCargarProductos.setVisible(true);
		ventanaCargarProductos.agregarListener(this);
		fcVentanaAbrir = new JFileChooser();
		filtro = new FileNameExtensionFilter("Archivo de texto","txt");
		fcVentanaAbrir.setFileFilter(filtro);
		otroProducto = new ArrayList<Producto>();
		this.ventanaCargarProductos.setListadoProdcuto(new VentanaCargarProductosModeloTabla(otroProducto));
		ventanaCargarProductos.habilitarGuardarProducto(false);
		ventanaCargarProductos.habilitarCargarProducto(true);
		registrarProducto = true;
		this.organizacion = organizacion;
		
		
		
	//	rif = this.organizacion.getRifComboBox();
	//	ventanaCargarProductos.setTiendasComboBox(rif);
	//	tiendas = this.organizacion.getTiendas();

		
		tiendaDao = new TiendaDAO();
		rift =  tiendaDao.nombreTiendas();
		ventanaCargarProductos.setTiendasComboBox(rift);
		productoDao = new ProductoDAO();
		
		numeroProducto = productoDao.numeroProducto();
		
		if (numeroProducto > 0){
			
			ventanaCargarProductos.cambiarCargarProducto();
			limpiar();
			ventanaCargarProductos.habilitarCargarProducto(true);
			
			ventanaCargarProductos.habilitarLimpiarProducto(false);
		}
		
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		
		
	if(numeroProducto > 0){	
		
		ventanaCargarProductos.cambiarCargarProducto();
		//limpiar();
		
		ventanaCargarProductos.habilitarCargarProducto(true);
		
		ventanaCargarProductos.habilitarLimpiarProducto(true);
		
		 if (e.getActionCommand().equalsIgnoreCase("Agregar Producto")) {
				
			if (this.ventanaCargarProductos.datosLlenos().equalsIgnoreCase("llenos")){
				 
				guardarProducto();
			 
			} else {
				 
				 this.ventanaCargarProductos.mostrarMensaje("Debe LLenar todos los campos");
			 }
			
			} else if (e.getActionCommand().equalsIgnoreCase("Limpiar")){
				
				limpiar();
			
			} else if (e.getActionCommand().equalsIgnoreCase("Buscar")){
				
				buscar();
				 
			} else if (e.getActionCommand().equalsIgnoreCase("Salir")){
				
				this.ventanaCargarProductos.setVisible(false);
				limpiar();		
			} 
		
		}  else {
		
			if (e.getActionCommand().equalsIgnoreCase("Cargar Producto")){
				
				cargarProducto();
				
			}
	}
		
	}

	private void limpiar() {
		
		ventanaCargarProductos.limpiarCamposProducto();
		ventanaCargarProductos.habilitarGuardarProducto(false);	
		ventanaCargarProductos.habilitarProducto(true,true);
		ventanaCargarProductos.habilitarBuscarProducto(true);
   		ventanaCargarProductos.bloquearVisible(false);
   		ventanaCargarProductos.bloqueraEnabled(false);
   		this.ventanaCargarProductos.setListadoProdcuto(new VentanaCargarProductosModeloTabla(otroProducto));
		
	}

	private void cargarProducto() {
		
		int opcion = fcVentanaAbrir.showOpenDialog(null);
		String part;
		
		if (opcion == JFileChooser.APPROVE_OPTION){
			part = fcVentanaAbrir.getSelectedFile().getAbsolutePath();
			file = new File(part);
			
			procesarArchivo(file);
			ventanaCargarProductos.cambiarCargarProducto();
			ventanaCargarProductos.habilitarLimpiarProducto(true);
			
		} 
		
	}

	private void buscar() {
		
		if(this.ventanaCargarProductos.getCodigoProducto().equalsIgnoreCase("") ||  (this.ventanaCargarProductos.getRifTienda().equalsIgnoreCase("Seleccione una opcion"))){
			
			 this.ventanaCargarProductos.mostrarMensaje("Debe Completar los Campos");
			
		  } else {
			    
			  	String nombre, riftienda;
		   		float precio;
		   		
			   	String cod = this.ventanaCargarProductos.getCodigoProducto();
			   	String nomRifTienda = this.ventanaCargarProductos.getRifTienda();
			   	
			   	
			   	riftienda = tiendaDao.rifTienda(nomRifTienda);
			   	
			   	//String rif = this.ventanaCargarProductos.getCodigoRifTiendaProducto(nomRifTienda, tiendas);
			   	
			    //int indiceTienda = this.organizacion.buscarTienda(rif);
			   	// int indiceProducto = this.organizacion.getUnaTienda(indiceTienda).buscarProducto(cod);
			    ArrayList<Producto> productoTienda = new ArrayList();
			   
			    producto = productoDao.buscarExistenciaProducto(riftienda, cod); 	
		 	    
			   	//if ( (indiceTienda >= 0) &&  indiceProducto >= 0 ){
			   	
			    if (producto != null) {
			   		//Existe el producto
			   	
			   		ventanaCargarProductos.mostrarMensaje("El producto ya existe");
			   		//ventanaCargarProductos.habilitarProducto(true);
			   		
//			   		Producto pro = this.organizacion.getUnaTienda(indiceTienda).getUnaProducto(indiceProducto);
//			   		productoTienda = this.organizacion.getUnaTienda(indiceTienda).getProductos();
			   		
			   		ArrayList<Producto> produ;
			   		produ = productoDao.consultarProducto(riftienda);
			   
			   		this.ventanaCargarProductos.setListadoProdcuto(new VentanaCargarProductosModeloTabla(produ));
			   		
			   		nombre = producto.getNombre();
			   		precio = producto.getPrecio();
			   		
			   		ventanaCargarProductos.setDatosExistente(nombre, precio);
			   		
			   		ventanaCargarProductos.bloquearVisible(true);
			   		ventanaCargarProductos.bloqueraEnabled(false);
			   		ventanaCargarProductos.habilitarCargarProducto(false);
			   		ventanaCargarProductos.habilitarBuscarProducto(false);
			   		ventanaCargarProductos.habilitarProducto(false, true);	
			   		
			   	} else{
			   		
			   		ArrayList<Producto> produ;
			   		produ = productoDao.consultarProducto(riftienda);
			   
			   		this.ventanaCargarProductos.setListadoProdcuto(new VentanaCargarProductosModeloTabla(produ));
			   		
			   		ventanaCargarProductos.habilitarCargarProducto(true);
			   		ventanaCargarProductos.habilitarGuardarProducto(false);
			   		ventanaCargarProductos.habilitarCargarProducto(true);
			   		ventanaCargarProductos.habilitarBuscarProducto(false);
			   		ventanaCargarProductos.bloquearVisible(true);
			   		ventanaCargarProductos.bloqueraEnabled(true);
			   		ventanaCargarProductos.habilitarProducto(false, true);
			   		
			   		this.ventanaCargarProductos.setListadoProdcuto(new VentanaCargarProductosModeloTabla(produ));
				
			   	}			     
		}
		
	}

	private void procesarArchivo(File file2) {
		// TODO Auto-generated method stub
		
		
		StringTokenizer tok;
		String codigo, descripcion, rifTienda="";
		float precio;
		

		try{
			
			FileReader fr = new FileReader (file);
			BufferedReader br = new BufferedReader(fr);
			String linea;
			
			 
			while((linea=br.readLine())!=null) {
				producto = new Producto();
				
				tok = new StringTokenizer(linea,";");
				codigo = tok.nextToken();
				descripcion = tok.nextToken();
			    precio = Float.parseFloat(tok.nextToken());
				rifTienda = tok.nextToken();
				
				//Crea el nuevo Producto
				//producto = new Producto(codigo, descripcion, precio, true, rifTienda);
				
				producto.setCodigo(codigo);
				producto.setNombre(descripcion);
				producto.setRifTienda(rifTienda);
				producto.setPrecio(precio);
				
				//Buscar el rif para saber a cual empresa pertenece el producto
				 //int i = this.organizacion.buscarTienda(rifTienda);
				 
				 Tienda tie = tiendaDao.buscarTienda(rifTienda);
				 
				 
			//	if (i >= 0){
				if (tie != null) {	
					
					//organizacion.buscarTienda(rifTienda).
					//this.organizacion.ingresarProductoTienda(rifTienda, producto);
					//this.modelProducto.add(producto);
				
					productoDao.registrarProducto(producto);
					
					
				} else {
					
					this.ventanaCargarProductos.mostrarMensaje("La tienda no exite y los datos del producto fueron: Codigo: " + codigo + " Descripcion: " + descripcion + " Rif de la Tienda: " + rifTienda);
					
				}
				
			} 
			
			cargarTablaProducto(rifTienda);
			ventanaCargarProductos.habilitarCargarProducto(false);
			
			
			
		} catch(Exception ex){
			
			this.ventanaCargarProductos.mostrarMensaje("Error : " + ex.getMessage());
			
		}
		
	}


	private void cargarTablaProducto(String riff) {
		// TODO Auto-generated method stub
		
		
		
		//ArrayList<Producto> otroProducto = new ArrayList();
		//this.ventanaCargarProductos.setListadoProdcuto(new VentanaCargarProductosModeloTabla(modelProducto));
		
		ArrayList<Producto> produ;
   		produ = productoDao.consultarProducto(riff);
   
   		this.ventanaCargarProductos.setListadoProdcuto(new VentanaCargarProductosModeloTabla(produ));
		
   		
		//if (this.modelProducto.size() > 0){
		   if( produ != null) {	
			
			   this.ventanaCargarProductos.setListadoProdcuto(new VentanaCargarProductosModeloTabla(produ));

		} else {
			
			this.ventanaCargarProductos.mostrarMensaje("Error no hay productos almacenados");
			
		}
		
	}
	
	private void guardarProducto() {
		// TODO Auto-generated method stub
		
		try{
				
				ArrayList<Producto> prod = new ArrayList();
			    
				String codigo, descripcion, rifTienda, nombreRifTienda;
			    float precio;
			    int indice;
			    
			    codigo = this.ventanaCargarProductos.getCodigoProducto();
			    descripcion = this.ventanaCargarProductos.getDescripcionProducto();
			    precio = Float.parseFloat(this.ventanaCargarProductos.getPrecioProducto());
			    nombreRifTienda = this.ventanaCargarProductos.getRifTienda();
			    
			    //rifTienda = this.ventanaCargarProductos.getCodigoRifTiendaProducto(nombreRifTienda, tiendas);
		
			    rifTienda = tiendaDao.rifTienda(nombreRifTienda);
			    
			    
			   // producto = new Producto(codigo, descripcion, precio, true, rifTienda);
			   // this.organizacion.ingresarProductoTienda(rifTienda, producto);
			    
			    producto.setCodigo(codigo);
			    producto.setNombre(descripcion);
			    producto.setPrecio(precio);
			    producto.setRifTienda(rifTienda);
			    
			    productoDao.registrarProducto(producto);
			    
			    
			    //indice = organizacion.buscarTienda(rifTienda);
			    //prod = organizacion.getUnaTienda(indice).getProductos();
			    
				ArrayList<Producto> produ;
		   		produ = productoDao.consultarProducto(rifTienda);
		   
		   		this.ventanaCargarProductos.setListadoProdcuto(new VentanaCargarProductosModeloTabla(produ));
			    
			    
			    ventanaCargarProductos.bloqueraEnabled(false);
			    ventanaCargarProductos.habilitarCargarProducto(false);

			    
		} catch (Exception exception){
			
			this.ventanaCargarProductos.mostrarMensaje("Error:  El precio no es Correcto");
		
		}
		
	}
	
			
}
